package de.pmg_grandma;

import interfaces.AbstractWish;
import enums.WishType;
import model.Model;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

public class CleanActivity extends Activity {
	//Werte für Schüttelfunktion
	private final float levelOfSpeedUp = 6.5f;
	private boolean firstStart = true;
	private boolean move = false;

	//Achsenwerte zum vergleichen
	private float firstMoveX;
	private float firstMoveY;
	private float firstMoveZ;
	private float lastMoveX;
	private float lastMoveY;
	private float lastMoveZ;
	private boolean shake = false;
	SensorManager manager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_clean);

		Log.i("Activity", "CleanActivity onCreate()");

		ImageView tempImage = (ImageView) findViewById(R.id.cleanImage);
		//Touchlistener um das Bild klickbar zu machen
		tempImage.setOnTouchListener(new View.OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				//beim Aufhören des Klickes auf das Bild
				if (event.getAction() == MotionEvent.ACTION_UP) {
					
					//Position des Fingers
					int x = (int) event.getX();
					//Bild dritteln um auf drei verschiedene Bereiche des Bildes
					//zu reagieren
					int drittel = v.getWidth()/3;
					//erstes Drittel -> Spulen-Bereich
					if(x <= drittel) {
						Log.i("Blobs", "spuelen");

						//Wenn der Wunsch für Abwaschen existiert: erfülle diesen
						AbstractWish wish = Model.getInstance().getWishes().get(WishType.WishToWashDishes);
						if(wish != null) {
							wish.fulfill();
							Toast.makeText(
									CleanActivity.this, 
									"Wunsch erfüllt (" + Model.getInstance().getWishes().size() + " Wünsche übrig)", 
									Toast.LENGTH_SHORT)
									.show();
						}
						//Wenn kein Wunsch für Abwaschen vorhanden ist, wird trotzdem abgewaschen
						else {
							Model.getInstance().washDishes();
							Toast.makeText(CleanActivity.this, "Geschirr ist wieder sauber", Toast.LENGTH_SHORT).show();
						}
						finish();
					}
					//zweites Drittel des Bildes -> Wasch-Bereich
					else if(x <= drittel*2) {
						Log.i("Blobs","waschen");

						//Wenn der Wunsch Waschen von Kleidung existiert: erfülle diesen
						AbstractWish wish = Model.getInstance().getWishes().get(WishType.WishToWashClothes);
						if (wish != null) {
							wish.fulfill();
							Toast.makeText(CleanActivity.this, 
									"Wunsch erfüllt (" + Model.getInstance().getWishes().size() + " Wünsche übrig)", 
									Toast.LENGTH_SHORT).show();
						} 
						//Wenn kein Wunsch für Waschen exestiert, wird trotzdem gewaschen
						else {
							Model.getInstance().washClothes();
						}


						Toast.makeText(CleanActivity.this, "Wäsche wurde gewaschen", Toast.LENGTH_SHORT).show();
						finish();
					}
					//letztes Drittel -> Putz-Bereich
					else if(x <= drittel*3) 
					{
						Log.i("Blobs","putzen");

						//Wenn der Wunsch Putzen exestiert: erfülle diesen
						AbstractWish wish = Model.getInstance().getWishes().get(WishType.WishToCleanApartment);
						if (wish != null) {
							wish.fulfill();
						} 
						//Wenn es keinen Wunsch gibt, passiert eigentlich auch nichts
						

						Toast.makeText(CleanActivity.this, "Wohnung ist wieder sauber", Toast.LENGTH_SHORT).show();
						finish();
					}
				}
				return true;
			}
		});
		
		//Sensor für die Schüttel-Funktion holen und Listener darauf registrieren
		manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
		manager.registerListener(listener, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
	}

	//Listener für die Schüttel-Funktion -> Wäsche waschen
	private SensorEventListener listener = new SensorEventListener() {
		@Override
		public void onAccuracyChanged(Sensor sensor, int accuracy) {}

		@Override
		public void onSensorChanged(SensorEvent event) {
			//Wenn Events existieren
			if(event.values.length > 0) {

				//Achsenwerte aus Sensor
				float x = event.values[0];
				float y = event.values[1];
				float z = event.values[2];

				updateValueOfSensor(x,y,z);
				move = checkMove();

				//Wurde Bewegungs erkannt, aber noch nicht geschüttelt, 
				//dann wird nächste Bewegung schütteln sein
				if(move && !shake) {
					shake = true;
				}

				//Wenn eben dann Bewegung immernoch vorliegt, wird es schuetteln sein
				else if(move && shake) {
					//Existiert der Wunsch zu waschen --> erfuelle ihn
					AbstractWish wish = Model.getInstance().getWishes().get(WishType.WishToWashClothes);
					if (wish != null) {
						wish.fulfill();
						Toast.makeText(
								CleanActivity.this, 
								"Wunsch erfüllt (" + Model.getInstance().getWishes().size() + " Wünsche übrig)", 
								Toast.LENGTH_SHORT)
								.show();
					}
					//andernfalls wasche dennoch
					else {
						Model.getInstance().washClothes();
						makeAtoast("Schütteln erkannt und Wäsche gewaschen");
						Log.i("SWIPE", "Schuetteln erkannt!!");
					}

					finish();
				}

				else if(!move && shake) {
					shake = false;
				}
			}
		}
	};
	
	protected void updateValueOfSensor(float currentX, float currentY, float currentZ) {
		//Da Werte zu Beginn immer auf 0 gesetzt sind, warte die "tatsächlichen" Werte ab
		if(firstStart) {
			firstMoveX = currentX;
			firstMoveY = currentY;
			firstMoveZ = currentZ;

			//Alles folgende sind tatsächliche Bewegungen
			firstStart = false;
		}
		else {
			firstMoveX = lastMoveX;
			firstMoveY = lastMoveY;
			firstMoveZ = lastMoveZ;
		}

		//ZwischenSpeichern
		lastMoveX = currentX;
		lastMoveY = currentY;
		lastMoveZ = currentZ;
	}

	protected boolean checkMove() {

		//Bilde absolute Differenz, um negative Werte zu vermeiden
		final float xDifference = Math.abs(firstMoveX - lastMoveX);
		final float yDifference = Math.abs(firstMoveY - lastMoveY);
		final float zDifference = Math.abs(firstMoveZ - lastMoveZ);

		//Wenn Differenz grösser als Schwellwert, wurde bewegt
		if(xDifference > levelOfSpeedUp || yDifference > levelOfSpeedUp || zDifference > levelOfSpeedUp) {
			return true;
		}
		return false;
	}

	public void makeAtoast(String text) {
		Toast.makeText(this, text + "", Toast.LENGTH_SHORT).show();
	}

	public void onButtonClick(View view) {
		this.finish();
	}

	@Override
	protected void onPause() {
		super.onPause();
		Model.getInstance().inAppFocus = false;
		manager.unregisterListener(listener);
		Log.i("Activity", "CleanActivity onPause()");
	}

	@Override
	protected void onStop() {
		Log.i("Activity", "CleanActivity onStop()");
		super.onStop();
	}

	@Override
	protected void onResume() {
		Model.getInstance().inAppFocus = true;
		super.onResume();
	}
}
